.. index:: single: CPack Packaging With CPack ******************** CPack is a powerful, easy to use, cross-platform software packaging tool distributed with CMake. It uses the generators concept from CMake to abstract package generation on specific platforms. It can be used with or without CMake, but it may depend on some software being installed on the system. Using a simple configuration file, or using a CMake module, the author of a project can package a complex project into a simple installer. This chapter will describe how to apply CPack to a CMake project. CPack Basics ============ .. index:: single: cygwin single: Debian single: Mac OS X ; Package Makers see: Windows ; NSIS single: NSIS single: Nullsoft Installer single: RPM Users of your software may not always want to, or be able to, build the software in order to install it. The software may be closed source, or it may take a long time to compile, or in the case of an end user application, the users may not have the skill or the tools to build the application. For these cases, what is needed is a way to build the software on one machine, and then move the install tree to a different machine. The most basic way to do this is to use the DESTDIR environment variable to install the software into a temporary location, then to tar or zip up that directory and move it to another machine. However, the DESTDIR approach falls short on Windows, simply because path names typically start with a drive letter (C:/) and you cannot simply prefix one full path with another and get a valid path name. Another more powerful approach is to use CPack, included in CMake. CPack is a tool included with CMake, it can be used to create installers and packages for projects. CPack can create two basic types of packages, source and binary. CPack works in much the same way as CMake does for building software. It does not aim to replace native packaging tools, rather it provides a single interface to a variety of tools. Currently CPack supports the creation of Windows installers using NullSoft installer NSIS or WiX, Mac OS X PackageMaker tool, OS X Drag and Drop, OS X X11 Drag and Drop, Cygwin Setup packages, Debian packages, RPMs, .tar.gz, .sh (self extracting .tar.gz files), and .zip compressed files. The implementation of CPack works in a similar way to CMake. For each type of packaging tool supported, there is a CPack generator written in C++ that is used to run the native tool and create the package. For simple tar based packages, CPack includes a library version of tar and does not require tar to be installed on the system. For many of the other installers, native tools must be present for CPack to function. .. index:: single: binary packages single: relocatable packages single: source packages With source packages, CPack makes a copy of the source tree and creates a zip or tar file. For binary packages, the use of CPack is tied to the install commands working correctly for a project. When setting up install commands, the first step is to make sure the files go into the correct directory structure with the correct permissions. The next step is to make sure the software is relocatable and can run in an installed tree. This may require changing the software itself, and there are many techniques to do that for different environments that go beyond the scope of this book. Basically, executables should be able to find data or other files using relative paths to the location of where it is installed. CPack installs the software into a temporary directory, and copies the install tree into the format of the native packaging tool. Once the install commands have been added to a project, enabling CPack in the simplest case is done by including the CPack.cmake file into the project. Simple Example -------------- The most basic CPack project would look like this .. index:: single: command ; add_executable single: command ; include single: command ; install single: command ; project .. code-block:: cmake cmake_minimum_required(VERSION 3.20) project(CoolStuff) add_executable(coolstuff coolstuff.cxx) install(TARGETS coolstuff RUNTIME DESTINATION bin) include(CPack) In the CoolStuff project, an executable is created and installed into the directory bin. Then the CPack file is included by the project. At this point project CoolStuff will have CPack enabled. To run CPack for a CoolStuff, you would first build the project as you would any other CMake project. CPack adds several targets to the generated project. These targets in Makefiles are package and package_source, and PACKAGE in Visual Studio and Xcode. For example, to build a source and binary package for CoolStuff using a Makefile generator you would run the following commands:: mkdir build cd build cmake ../CoolStuff make make package make package_source This would create a source zip file called ``CoolStuff-0.1.1-Source.zip``, a NSIS installer called ``CoolStuff-0.1.1-win32.exe``, and a binary zip file ``CoolStuff-0.1.1-win32.zip``. The same thing could be done using the CPack command line. :: cd build cpack --config CPackConfig.cmake cpack --config CPackSourceConfig.cmake What Happens When CPack.cmake Is Included? ------------------------------------------ .. index:: single: CPack ; variables When the ``include(CPack)`` command is executed, the ``CPack.cmake`` file is included into the project. By default this will use the :command:`configure_file` command to create ``CPackConfig.cmake`` and ``CPackSourceConfig.cmake`` in the binary tree of the project. These files contain a series of set commands that set variables for use when CPack is run during the packaging step. The names of the files that are configured by the ``CPack.cmake`` file can be customized with these two variables; ``CPACK_OUTPUT_CONFIG_FILE`` which defaults to ``CPackConfig.cmake`` and ``CPACK_SOURCE_OUTPUT_CONFIG_FILE`` which defaults to ``CPackSourceConfig.cmake``. The source for these files can be found in the ``Templates/CPackConfig.cmake.in``. This file contains some comments, and a single variable that is set by ``CPack.cmake``. The file contains this line of CMake code:: @_CPACK_OTHER_VARIABLES_@ If the project contains the file ``CPackConfig.cmake.in`` in the top level of the source tree, that file will be used instead of the file in the Templates directory. If the project contains the file ``CPackSourceConfig.cmake.in``, then that file will be used for the creation of ``CPackSourceConfig.cmake``. The configuration files created by ``CPack.cmake`` will contain all the variables that begin with "CPACK\_\" in the current project. This is done using the command .. index:: single: command ; get_cmake_property .. code-block:: cmake get_cmake_property(res VARIABLES) The above command gets all variables defined for the current CMake project. Some CMake code then looks for all variables starting with "CPACK\_\", and each variable found is configured into the two configuration files as CMake code. For example, if you had a variable set like this in your CMake project .. index:: single: command ; set .. code-block:: cmake set(CPACK_PACKAGE_NAME "CoolStuff") ``CPackConfig.cmake`` and ``CPackSourceConfig.cmake`` would have the same thing in them: .. code-block:: cmake set(CPACK_PACKAGE_NAME "CoolStuff") .. index:: single: CPack ; escape characters It is important to keep in mind that CPack is run after CMake on the project. CPack uses the same parser as CMake, but will not have the same variable values as the CMake project. It will only have the variables that start with CPACK\_\, and these variables will be configured into a configuration file by CMake. This can cause some errors and confusion if the values of the variables use escape characters. Since they are getting parsed twice by the CMake language, they will need double the level of escaping. For example, if you had the following in your CMake project: .. code-block:: cmake set(CPACK_PACKAGE_VENDOR "Cool \"Company\"") The resulting CPack files would have this: .. code-block:: cmake set(CPACK_PACKAGE_VENDOR "Cool "Company"") That would not be exactly what you would want or expect. In fact, it just wouldn't work. To get around this problem, there are two solutions. The first is to add an additional level of escapes to the original set command like this: .. code-block:: cmake set(CPACK_PACKAGE_VENDOR "Cool \\\"Company\\\"") This would result in the correct ``set`` command which would look like this: .. code-block:: cmake set(CPACK_PACKAGE_VENDOR "Cool \"Company\"") The second solution to the escaping problem is to use a CPack project config file, explained in the next section. Adding Custom CPack Options --------------------------- To avoid the escaping problem a project specific CPack configure file can be specified. This file will be loaded by CPack after ``CPackConfig.cmake`` or ``CPackSourceConfig.cmake`` is loaded, and :variable:`CPACK_GENERATOR` will be set to the CPack generator being run. Variables set in this file only require one level of CMake escapes. This file can be configured or not, and contains regular CMake code. In the example above, you could move ``CPACK_PACKAGE_VENDOR`` into a file ``MyCPackOptions.cmake.in`` and configure that file into the build tree of the project. Then set the project configuration file path like this: .. code-block:: cmake configure_file ("${PROJECT_SOURCE_DIR}/MyCPackOptions.cmake.in" "${PROJECT_BINARY_DIR}/MyCPackOptions.cmake" @ONLY) set (CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/MyCPackOptions.cmake") Where ``MyCPackOptions.cmake.in`` contained: .. code-block:: cmake set(CPACK_PACKAGE_VENDOR "Cool \"Company\"") The :variable:`CPACK_PROJECT_CONFIG_FILE` variable should contain the full path to the CPack config file for the project, as seen in the above example. This has the added advantage that the CMake code can contain if statements based on the :variable:`CPACK_GENERATOR` value, so that packager specific values can be set for a project. For example, the CMake project sets the icon for the installer in this file: .. code-block:: cmake set (CPACK_NSIS_MUI_ICON "@CMake_SOURCE_DIR@/Utilities/Release\\CMakeLogo.ico") .. index:: single: NSIS Note that the path has forward slashes except for the last part which has an escaped \ as the path separator. As of the writing of this book, NSIS needed the last part of the path to have a Windows style slash. If you do not do this, you may get the following error:: File: ".../Release/CMakeLogo.ico" -> no files found. Usage: File [/nonfatal] [/a] ([/r] [/x filespec [...]] filespec [...] | /oname=outfile one_file_only) Options Added by CPack ---------------------- .. index:: single: CPack ; generators In addition to creating the two configuration files, ``CPack.cmake`` will add some advanced options to your project. The options added depend on the environment and OS that CMake is running on, and control the default packages that are created by CPack. These options are of the form ``CPACK_``, where generator names available on each platform can be found in the following table: +------------+---------------+-------------+--------------+ | Windows | Cygwin | Linux/UNIX | Mac OS X | +============+===============+=============+==============+ | NSIS | CYGWIN_BINARY | DEB | PACKAGEMAKER | +------------+---------------+-------------+--------------+ | ZIP | SOURCE_CYGWIN | RPM | DRAGNDROP | +------------+---------------+-------------+--------------+ | SOURCE_ZIP | | STGZ | BUNDLE | +------------+---------------+-------------+--------------+ | | | TBZ2 | OSXX11 | +------------+---------------+-------------+--------------+ | | | TGZ | | +------------+---------------+-------------+--------------+ | | | TZ | | +------------+---------------+-------------+--------------+ | | | SOURCE_TGZ | | +------------+---------------+-------------+--------------+ | | | SOURCE_TZ | | +------------+---------------+-------------+--------------+ Turning these options on or off affects the packages that are created when running CPack with no options. If the option is off in the CMakeCache.txt file for the project, you can still build that package type by specifying the -G option to the CPack command line. .. index:: single: source package CPack Source Packages ===================== Source packages in CPack simply copy the entire source tree for a project into a package file, and no install rules are used as they are in the case of binary packages. Out of source builds should be used to avoid having extra binary stuff polluting the source package. If you have files or directories in your source tree that are not wanted in the source package, you can use the variable :variable:`CPACK_SOURCE_IGNORE_FILES` to exclude things from the package. This variable contains a list of regular expressions. Any file or directory that matches a regular expression in that list will be excluded from the sources. The default setting is as follows:: "/CVS/;/\\\\\\\\.svn/;\\\\\\\\.swp$;\\\\\\\\.#;/#" There are many levels of escapes used in the default value as this variable is parsed by CMake once and CPack again. It is important to realize that the source tree will not use any install commands, it will simply copy the entire source tree minus the files it is told to ignore into the package. To avoid the multiple levels of escape, the file referenced by :variable:`CPACK_PROJECT_CONFIG_FILE` should be used to set this variable. The expression is a regular expression and not a wild card statement, see Chapter 4 for more information about CMake regular expressions. CPack Installer Commands ======================== Since binary packages require CPack to interact with the install rules of the project being packaged, this section will cover some of the options CPack provides to interact with the install rules of a project. CPack can work with CMake's install scripts or with external install commands. CPack and CMake install commands -------------------------------- In most CMake projects, using the CMake install rules will be sufficient to create the desired package. By default CPack will run the install rule for the current project. However, if you have a more complicated project, you can specify sub-projects and install directories with the variable :variable:`CPACK_INSTALL_CMAKE_PROJECTS`. This variable should hold quadruplets of install directory, install project name, install component, and install subdirectory. For example, if you had a project with a sub project called MySub that was compiled into a directory called SubProject, and you wanted to install all of its components, you would have this: .. code-block:: cmake SET(CPACK_INSTALL_CMAKE_PROJECTS "SubProject;MySub;ALL;/") .. index:: single: CPack ; DESTDIR CPack and DESTDIR ----------------- By default CPack does not use the :envvar:`DESTDIR` option during the installation phase. Instead it sets the :variable:`CMAKE_INSTALL_PREFIX` to the full path of the temporary directory being used by CPack to stage the install package. This can be changed by setting :variable:`CPACK_SET_DESTDIR` to on. If the :variable:`CPACK_SET_DESTDIR` option is on, CPack will use the project's cache value for ``CPACK_INSTALL_PREFIX``, and set :envvar:`DESTDIR` to the temporary staging area. This allows absolute paths to be installed under the temporary directory. Relative paths are installed into ``DESTDIR/${project's CMAKE_INSTALL_PREFIX}`` where :envvar:`DESTDIR` is set to the temporary staging area. As noted earlier, the :envvar:`DESTDIR` approach does not work when the install rules reference files by Windows full paths beginning with drive letters (C:/). When doing a non-:envvar:`DESTDIR` install for packaging, which is the default, any absolute paths are installed into absolute directories, and not into the package. Therefore, projects that do not use the :envvar:`DESTDIR` option, must not use any absolute paths in install rules. Conversely, projects that use absolute paths, must use the :envvar:`DESTDIR` option. One other variable can be used to control the root path projects are installed into, the :variable:`CPACK_PACKAGING_INSTALL_PREFIX`. By default many of the generators install into the directory /usr. That variable can be used to change that to any directory, including just /. CPack and other installed directories ------------------------------------- It is possible to run other install rules if the project is not CMake based. This can be done by using the variables :variable:`CPACK_INSTALL_COMMANDS`, and :variable:`CPACK_INSTALLED_DIRECTORIES`. :variable:`CPACK_INSTALL_COMMANDS` are commands that will be run during the installation phase of the packaging. :variable:`CPACK_INSTALLED_DIRECTORIES` should contain pairs of directory and subdirectory. The subdirectory can be '.' to be installed in the top-level directory of the installation. The files in each directory will be copied to the corresponding subdirectory of the CPack staging directory and packaged with the rest of the files. .. index:: single: NSIS CPack for Windows Installer NSIS ================================ To create Windows style wizard based installer programs, CPack uses NSIS (NullSoft Scriptable Install System). More information about NSIS can be found at the NSIS home page: http://nsis.sourceforge.net/ NSIS is a powerful tool with a scripting language used to create professional Windows installers. To create Windows installers with CPack, you will need NSIS installed on your machine. CPack uses configured template files to control NSIS. There are two files configured by CPack during the creation of a NSIS installer. Both files are found in the CMake Modules directory. ``Modules/NSIS.template.in`` is the template for the NSIS script, and ``Modules/NSIS.InstallOptions.ini.in`` is the template for the modern user interface or MUI used by NSIS. The install options file contains the information about the pages used in the install wizard. This section will describe how to configure CPack to create an NSIS install wizard. CPack Variables Used by CMake for NSIS -------------------------------------- This section contains screen captures from the CMake NSIS install wizard. For each part of the installer that can be changed or controlled from CPack, the variables and values used are given. The first thing that a user will see of the installer in Windows is the icon for the installer executable itself. By default the installer will have the Null Soft Installer icon, as seen in Figure :num:`figure-IconforinstallerinWindowsExplorer` for the 20071023 CMake installer. This icon can be changed by setting the variable ``CPACK_NSIS_MUI_ICON``. The installer for 20071025 in the same figure shows the CMake icon being used for the installer. .. _`figure-IconforinstallerinWindowsExplorer`: .. figure:: image/IconforinstallerinWindowsExplorer.png Icon for installer in Windows Explorer The last thing a users will see of the installer in Windows is the icon for the uninstall executable, as seen in Figure :num:`figure-UninstallIconforNSISinstaller`. This option can be set with the ``CPACK_NSIS_MUI_UNIICON`` variable. Both the install and uninstall icons must be the same size and format, a valid windows .ico file usable by Windows Explorer. The icons are set like this:: # set the install/uninstall icon used for the installer itself set (CPACK_NSIS_MUI_ICON "${CMake_SOURCE_DIR}/Utilities/Release\\CMakeLogo.ico") set (CPACK_NSIS_MUI_UNIICON "${CMake_SOURCE_DIR}/Utilities/Release\\CMakeLogo.ico") .. _`figure-UninstallIconforNSISinstaller`: .. figure:: image/UninstallIconforNSISinstaller.png Uninstall Icon for NSIS installer On Windows, programs can also be removed using the Add or Remove Programs tool from the control panel as seen in Figure :num:`figure-AddorRemoveProgramsEntry`. The icon for this should be embedded in one of the installed executables. This can be set like this: .. code-block:: cmake # set the add/remove programs icon using an installed executable SET(CPACK_NSIS_INSTALLED_ICON_NAME "bin\\cmake-gui.exe") .. _`figure-AddorRemoveProgramsEntry`: .. figure:: image/AddorRemoveProgramsEntry.png Add or Remove Programs Entry .. _`figure-FirstScreenofInstallWizard`: .. figure:: image/FirstScreenofInstallWizard.png First Screen of Install Wizard When running the installer, the first screen of the wizard will look like Figure :num:`figure-FirstScreenofInstallWizard`. In this screen you can control the name of the project that shows up in two places on the screen. The name used for the project is controlled by the variable :variable:`CPACK_PACKAGE_INSTALL_DIRECTORY` or :variable:`CPACK_NSIS_PACKAGE_NAME`. In this example, it was set to "CMake 2.5" like this: .. code-block:: cmake set (CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}") or this: .. code-block:: cmake set (CPACK_NSIS_PACKAGE_NAME "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}") .. _`figure-SecondScreenofInstallWizard`: .. figure:: image/SecondScreenofInstallWizard.png Second Screen of Install Wizard The second page of the install wizard can be seen in Figure :num:`figure-SecondScreenofInstallWizard`. This screen contains the license agreement and there are several things that can be configured on this page. The banner bitmap to the left of the "License Agreement" label is controlled by the variable ``CPACK_PACKAGE_ICON`` like this: .. code-block:: cmake set (CPACK_PACKAGE_ICON "${CMake_SOURCE_DIR}/Utilities/Release\\CMakeInstall.bmp") :variable:`CPACK_PACKAGE_INSTALL_DIRECTORY` is used again on this page everywhere you see the text "CMake 2.5". The text of the license agreement is set to the contents of the file specified in the :variable:`CPACK_RESOURCE_FILE_LICENSE` variable. CMake does the following: .. code-block:: cmake set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt") .. _`figure-Thirdpageofinstallerwizard`: .. figure:: image/Thirdpageofinstallerwizard.png Third page of installer wizard The third page of the installer can be seen in Figure :num:`figure-Thirdpageofinstallerwizard`. This page will only show up if :variable:`CPACK_NSIS_MODIFY_PATH` is set to on. If you check the Create "name" Desktop Icon button, and you put executable names in the variable :variable:`CPACK_CREATE_DESKTOP_LINKS`, then a desktop icon for those executables will be created. For example, to create a desktop icon for the cmake-gui program of CMake, the following is done: .. code-block:: cmake set (CPACK_CREATE_DESKTOP_LINKS cmake-gui) Multiple desktop links can be created if your application contains more than one executable. The link will be created to the Start Menu entry, so :variable:`CPACK_PACKAGE_EXECUTABLES`, which is described later in this section, must also contain the application in order for a desktop link to be created. .. _`figure-Fourthpageofinstallerwizard`: .. figure:: image/Fourthpageofinstallerwizard.png Fourth page of installer wizard The fourth page of the installer seen in Figure :num:`figure-Fourthpageofinstallerwizard` uses the variable :variable:`CPACK_PACKAGE_INSTALL_DIRECTORY` to specify the default destination folder in Program Files. The following CMake code was used to set that default: .. code-block:: cmake set (CPACK_PACKAGE_INSTALL_DIRECTORY "CMake ${CMake_VERSION_MAJOR}.${CMake_VERSION_MINOR}") The remaining pages of the installer wizard do not use any additional CPack variables, and are not included in this section. Another important option that can be set by the NSIS CPack generator is the registry key used. There are several CPack variables that control the default key used. The key is defined in the NSIS.template.in file as follows:: !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\@CPACK_PACKAGE_VENDOR@\@CPACK_PACKAGE_INSTALL_REGISTRY_KEY@" Where the ``CPACK_PACKAGE_VENDOR`` value defaults to Kitware, and ``CPACK_PACKAGE_INSTALL_REGISTRY_KEY`` defaults to ``${CPACK_PACKAGE_NAME} ${CPACK_PACKAGE_VERSION}`` So for CMake 2.5.20071025 the registry key would look like this:: HKEY_LOCAL_MACHINE\SOFTWARE\Kitware\CMake 2.5.20071025 Creating Windows Short Cuts in the Start Menu --------------------------------------------- There are two variables that control the short cuts that are created in the Windows Start menu by NSIS. The variables contain lists of pairs, and must have an even number of elements to work correctly. The first is ``CPACK_PACKAGE_EXECUTABLES``, it should contain the name of the executable file followed by the name of the shortcut text. For example in the case of CMake, the executable is called cmake-gui, but the shortcut is named "CMake". CMake does the following to create that shortcut: .. code-block:: cmake set (CPACK_PACKAGE_EXECUTABLES "cmake-gui" "CMake" ) The second is ``CPACK_NSIS_MENU_LINKS``. This variable contains arbitrary links into the install tree, or to external web pages. The first of the pair is always the existing source file or location, and the second is the name that will show up in the Start menu. To add a link to the help file for cmake-gui and a link to the CMake web page add the following: .. code-block:: cmake set (CPACK_NSIS_MENU_LINKS "doc/cmake-${VERSION_MAJOR}.${VERSION_MINOR}/cmake-gui.html" "cmake-gui Help" "http://www.cmake.org" "CMake Web Site") Advanced NSIS CPack Options --------------------------- In addition to the variables already discussed, CPack provides a few additional variables that are directly configured into the NSIS script file. These can be used to add NSIS script fragments to the final NSIS script used to create the installer. They are as follows: **CPACK_NSIS_EXTRA_INSTALL_COMMANDS** Extra commands used during install. **CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS** Extra commands used during uninstall. **CPACK_NSIS_CREATE_ICONS_EXTRA** Extra NSIS commands in the icon section of the script. **CPACK_NSIS_DELETE_ICONS_EXTRA** Extra NSIS commands in the delete icons section of the script. When using these variables the NSIS documentation should be referenced, and the author should look at the ``NSIS.template.in`` file for the exact placement of the variables. Setting File Extension Associations With NSIS --------------------------------------------- One example of a useful thing that can be done with the extra install commands is to create associations from file extensions to the installed application. For example, if you had an application CoolStuff that could open files with the extension ``.cool``, you would set the following extra install and uninstall commands: .. code-block:: cmake set (CPACK_NSIS_EXTRA_INSTALL_COMMANDS " WriteRegStr HKCR '.cool' '' 'CoolFile' WriteRegStr HKCR 'CoolFile' '' 'Cool Stuff File' WriteRegStr HKCR 'CoolFile\\shell' '' 'open' WriteRegStr HKCR 'CoolFile\\DefaultIcon' \\ '' '$INSTDIR\\bin\\coolstuff.exe,0' WriteRegStr HKCR 'CoolFile\\shell\\open\\command' \\ '' '$INSTDIR\\bin\\coolstuff.exe \"%1\"' WriteRegStr HKCR \"CoolFile\\shell\\edit' \\ '' 'Edit Cool File' WriteRegStr HKCR 'CoolFile\\shell\\edit\\command' \\ '' '$INSTDIR\\bin\\coolstuff.exe \"%1\"' System::Call \\ 'Shell32::SHChangeNotify(i 0x8000000, i 0, i 0, i 0)' ") set (CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS " DeleteRegKey HKCR '.cool' DeleteRegKey HKCR 'CoolFile' ") This creates a Windows file association to all files ending in ``.cool``, so that when a user double clicks on a ``.cool`` file, ``coolstuff.exe`` is run with the full path to the file as an argument. This also sets up an association for editing the file from the windows right-click menu to the same ``coolstuff.exe`` program. The Windows explorer icon for the file is set to the icon found in the ``coolstuff.exe`` executable. When it is uninstalled, the registry keys are removed. Since the double quotes and Windows path separators must be escaped, it is best to put this code into the ``CPACK_PROJECT_CONFIG_FILE`` for the project. .. code-block:: cmake configure_file( ${CoolStuff_SOURCE_DIR}/CoolStuffCPackOptions.cmake.in ${CoolStuff_BINARY_DIR}/CoolStuffCPackOptions.cmake @ONLY) set (CPACK_PROJECT_CONFIG_FILE ${CoolStuff_BINARY_DIR}/CoolStuffCPackOptions.cmake) include (CPack) .. index:: single: Windows ; manifest files single: Windows ; run time libraries Installing Microsoft Run Time Libraries --------------------------------------- Although not strictly an NSIS CPack command, if you are creating applications on Windows with the Microsoft compiler you will most likely want to distribute the run time libraries from Microsoft alongside your project. In CMake, all you need to do is the following: .. code-block:: cmake include (InstallRequiredSystemLibraries) This will add the compiler run time libraries as install files that will go into the bin directory of your application. If you do not want the libraries to go into the bin directory, you would do this: .. code-block:: cmake set (CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) include (InstallRequiredSystemLibraries) install (PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION mydir) It is important to note that the run time libraries must be right next to the executables of your package in order for Windows to find them. With Visual Studio 2005 and 2008, side by side manifest files are also required to be installed with your application when distributing the run time libraries. If you want to package a debug version of your software you will need to set ``CMAKE_INSTALL_DEBUG_LIBRARIES`` to ON prior to the include. Be aware, however, that the license terms may prohibit you from re-distributing the debug libraries. Double check the licensing terms for the version of Visual Studio you're using before deciding to set ``CMAKE_INSTALL_DEBUG_LIBRARIES`` to ON. .. index:: single: CPack ; components CPack Component Install Support ------------------------------- By default, CPack's installers consider all of the files installed by a project as a single, monolithic unit: either the whole set of files is installed, or none of the files are installed. However, with many projects it makes sense for the installation to be subdivided into distinct, user-selectable components. Some users may want to install only the command-line tools for a project, while other users might want the GUI or the header files. This section describes how to configure CPack to generate component-based installers that allow users to select the set of project components that they wish to install. As an example, a simple installer will be created for a library that has three components: a library binary, a sample application, and a C++ header file. When finished the resulting installers for Windows and Mac OS X look like the ones in Figure :num:`figure-MacandWindowsComponentInstallers`. .. _`figure-MacandWindowsComponentInstallers`: .. figure:: image/MacandWindowsComponentInstallers.png Mac and Windows Component Installers The simple example we will be working with is as follows; it has a library and an executable. CPack commands that have already been covered are used. .. code-block:: cmake cmake_minimum_required(VERSION 3.20 FATAL_ERROR) project(MyLib) add_library(mylib mylib.cpp) add_executable(mylibapp mylibapp.cpp) target_link_libraries(mylibapp mylib) install(TARGETS mylib ARCHIVE DESTINATION lib) install(TARGETS mylibapp RUNTIME DESTINATION bin) install(FILES mylib.h DESTINATION include) # add CPack to project set(CPACK_PACKAGE_NAME "MyLib") set(CPACK_PACKAGE_VENDOR "CMake.org") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "MyLib - CPack Component Installation Example") set(CPACK_PACKAGE_VERSION "1.0.0") set(CPACK_PACKAGE_VERSION_MAJOR "1") set(CPACK_PACKAGE_VERSION_MINOR "0") set(CPACK_PACKAGE_VERSION_PATCH "0") set(CPACK_PACKAGE_INSTALL_DIRECTORY "CPack Component Example") # This must always be after all CPACK\_\* variables are defined include(CPack) Specifying Components ^^^^^^^^^^^^^^^^^^^^^ The first step in building a component-based installation is to identify the set of installable components. In this example, three components will be created: the library binary, the application, and the header file. This decision is arbitrary and project-specific, but be sure to identify the components that correspond to units of functionality important to your user, rather than basing the components on the internal structure of your program. For each of these components, we need to identify which component each of the installed files belong in. For each :command:`install` command in CMakeLists.txt, add an appropriate ``COMPONENT`` argument stating which component the installed files will be associated with: .. code-block:: cmake install(TARGETS mylib ARCHIVE DESTINATION lib COMPONENT libraries) install(TARGETS mylibapp RUNTIME DESTINATION bin COMPONENT applications) install(FILES mylib.h DESTINATION include COMPONENT headers) Note that the ``COMPONENT`` argument to the :command:`install` command is not new; it has been a part of CMake's :command:`install`. If using any of the older installation commands (:command:`install_targets`, :command:`install_files`, etc.), you will need to convert them to :command:`install` commands in order to use components. The next step is to notify CPack of the names of all of the components in your project by calling the ``cpack_add_component`` function for each component of the package: .. code-block:: cmake cpack_add_component(applications) cpack_add_component(libraries) cpack_add_component(headers) At this point you can build a component-based installer with CPack that will allow one to independently install the applications, libraries, and headers of MyLib. The Windows and Mac OS X installers will look like the ones shown in Figure :num:`figure-WindowsandMacOSXComponentInstallerFirstPage`. .. _`figure-WindowsandMacOSXComponentInstallerFirstPage`: .. figure:: image/WindowsandMacOSXComponentInstallerFirstPage.png Windows and Mac OS X Component Installer First Page Naming Components ^^^^^^^^^^^^^^^^^ At this point, you may have noted that the names of the actual components in the installer are not very descriptive: they just say "applications," "libraries," or "headers," as specified in the component names. These names can be improved by using the DISPLAY_NAME option in the ``cpack_add_component function``: .. code-block:: cmake cpack_add_component(applications DISPLAY_NAME "MyLib Application") cpack_add_component(libraries DISPLAY_NAME "Libraries") cpack_add_component(headers DISPLAY_NAME "C++ Headers") Any macro prefixed with ``CPACK_COMPONENT_${COMPNAME}``, where ``${COMPNAME}`` is the uppercase name of a component, is used to set a particular property of that component in the installer. Here, we set the ``DISPLAY_NAME`` property of each of our components so that we get human-readable names. These names will be listed in the selection box rather than the internal component names "applications," "libraries," "headers," .. _`figure-WindowsandMacOSXInstallerswithnamedcomponents`: .. figure:: image/WindowsandMacOSXInstallerswithnamedcomponents.png Windows and Mac OS X Installers with named components Adding Component Descriptions ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There are several other properties associated with components, including the ability to make a component hidden, required, or disabled by default, that provide additional descriptive information. Of particular note is the ``DESCRIPTION`` property, which provides some descriptive text for the component. This descriptive text will show up in a separate "description" box in the installer, and will be updated either when the user's mouse hovers over the name of the corresponding component (Windows), or when the user clicks on a component (Mac OS X). We will add a description for each of our components below: .. code-block:: cmake cpack_add_component(applications DISPLAY_NAME "MyLib Application" DESCRIPTION "An extremely useful application that makes use of MyLib" ) cpack_add_component(libraries DISPLAY_NAME "Libraries" DESCRIPTION "Static libraries used to build programs with MyLib" ) cpack_add_component(headers DISPLAY_NAME "C++ Headers" DESCRIPTION "C/C++ header files for use with MyLib" ) Generally, descriptions should provide enough information for the user to make a decision on whether to install the component, but should not themselves be more than a few lines long (the "Description" box in the installers tends to be small). Figure :num:`figure-ComponentInstallerswithdescriptions` shows the description display for both the Windows and Mac OS X installers. .. _`figure-ComponentInstallerswithdescriptions`: .. figure:: image/ComponentInstallerswithdescriptions.png Component Installers with descriptions Component Interdependencies ^^^^^^^^^^^^^^^^^^^^^^^^^^^ With most projects the various components are not completely independent. For example, an application component may depend on the shared libraries in another component to execute properly, such that installing the application component without the corresponding shared libraries would result in an unusable installation. CPack allows you to express the dependencies between components, so that a component will only be installed if all of the other components it depends on are also installed. To illustrate component dependencies we will place a simple restriction on our component-based installer. Since we do not provide source code in our installer, the C++ header files we distribute can only actually be used if the user also installs the library binary to link their program against. Thus, the "headers" component depends on the availability of the "libraries" component. We can express this notion by setting the ``DEPENDS`` property for the ``HEADERS`` component as such: .. code-block:: cmake cpack_add_component(headers DISPLAY_NAME "C++ Headers" DESCRIPTION "C/C++ header files for use with MyLib" DEPENDS libraries ) The ``DEPENDS`` property for a component is actually a list, as such a component can depend on several other components. By expressing all of the component dependencies in this manner you can ensure that users will not be able to select an incomplete set of components at installation time. Grouping Components ^^^^^^^^^^^^^^^^^^^ When the number of components in your project grows large, you may need to provide additional organization for the list of components. To help with this organization, CPack includes the notion of component groups. A component group is simply a way to provide a name for a group of related components. Within the user interface a component group has its own name, and underneath that group are the names of all of the components in that group. Users will have the option to (de-)select the installation of all components in the group with a single click, or expand the group to select individual components. We will expand our example by categorizing its three components, "applications," "libraries," and "headers," into "Runtime" and "Development" groups. We can place a component into a group by using the ``GROUP`` option to the ``cpack_add_component`` function as follows: .. code-block:: cmake cpack_add_component(applications DISPLAY_NAME "MyLib Application" DESCRIPTION "An extremely useful application that makes use of MyLib" GROUP Runtime) cpack_add_component(libraries DISPLAY_NAME "Libraries" DESCRIPTION "Static libraries used to build programs with MyLib" GROUP Development) cpack_add_component(headers DISPLAY_NAME "C++ Headers" DESCRIPTION "C/C++ header files for use with MyLib" GROUP Development DEPENDS libraries ) Like components, component groups have various properties that can be customized, including the ``DISPLAY_NAME`` and ``DESCRIPTION``. For example, the following code adds an expanded description to the "Development" group: .. code-block:: cmake cpack_add_component_group(Development EXPANDED DESCRIPTION "All of the tools you'll ever need to develop software") Once you have customized the component groups to your liking, rebuild the binary installer to see the new organization: the MyLib application will show up under the new "Runtime" group, while the MyLib library and C++ header will show up under the new "Development" group. One can easily turn on/off all of the components within a group using the installer's GUI. This can be seen in Figure :num:`figure-ComponentGrouping`. .. _`figure-ComponentGrouping`: .. figure:: image/ComponentGrouping.png Component Grouping Installation Types (NSIS Only) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ When a project contains a large number of components, it is common for a Windows installer to provide pre-selected sets of components based on specific user needs. For example, a user wanting to develop software against a library will want one set of components, while an end user might use an entirely different set. CPack supports this notion of pre-selected component sets via installation types. An installation type is simply a set of components. When the user selects an installation type, exactly that set of components is selected. Then the user is permitted to further customize their installation as desired. Currently this is only supported by the NSIS generator. For our simple example, we will create two installation types: a "Full" installation type that contains all of the components, and a "Developer" installation type that includes only the libraries and headers. To do this we use the function ``cpack_add_install_type`` to add the types. .. code-block:: cmake cpack_add_install_type(Full DISPLAY_NAME "Everything") cpack_add_install_type(Developer) Next, we set the ``INSTALL_TYPES`` property of each component to state which installation types will include that component. This is done with the INSTALL_TYPES option to the ``cpack_add_component`` function. .. code-block:: cmake cpack_add_component(libraries DISPLAY_NAME "Libraries" DESCRIPTION "Static libraries used to build programs with MyLib" GROUP Development INSTALL_TYPES Developer Full) cpack_add_component(applications DISPLAY_NAME "MyLib Application" DESCRIPTION "An extremely useful application that makes use of MyLib" GROUP Runtime INSTALL_TYPES Full) cpack_add_component(headers DISPLAY_NAME "C++ Headers" DESCRIPTION "C/C++ header files for use with MyLib" GROUP Development DEPENDS libraries INSTALL_TYPES Developer Full) Components can be listed under any number of installation types. If you rebuild the Windows installer, the components page will contain a combo box that allows you to select the installation type, and therefore its corresponding set of components as shown in Figure :num:`figure-NSISInstallationTypes`. .. _`figure-NSISInstallationTypes`: .. figure:: image/NSISInstallationTypes.png NSIS Installation Types Variables that control CPack components ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The functions ``cpack_add_install_type``, ``cpack_add_component_group``, and ``cpack_add_component`` just set ``CPACK_`` variables. Those variables are described in the following list: **CPACK_COMPONENTS_ALL** This is a list containing the names of all components that should be installed by CPack. The presence of this macro indicates that CPack should build a component-based installer. Files associated with any components not listed here or any installation commands not associated with any component will not be installed. **CPACK_COMPONENT_${COMPNAME}_DISPLAY_NAME** The displayed name of the component ${COMPNAME}, used in graphical installers to display the component name. This value can be any string. **CPACK_COMPONENT_${COMPNAME}_DESCRIPTION** An extended description of the component ${COMPNAME}, used in graphical installers to give the user additional information about the component. Descriptions can span multiple lines using "\\n" as the line separator. **CPACK_COMPONENT_${COMPNAME}_HIDDEN** A flag that indicates that this component will be hidden in the graphical installer, and therefore cannot be selected or installed. Only available with NSIS. **CPACK_COMPONENT_${COMPNAME}_REQUIRED** A flag that indicates that this component is required, and therefore will always be installed. It will be visible in the graphical installer but it cannot be unselected. **CPACK_COMPONENT_${COMPNAME}_DISABLED** A flag that indicates that this component should be disabled (unselected) by default. The user is free to select this component for installation. **CPACK_COMPONENT_${COMPNAME}_DEPENDS** Lists the components on which this component depends. If this component is selected, then each of the components listed must also be selected. **CPACK_COMPONENT_${COMPNAME}_GROUP** Names a component group that this component is a part of. If not provided, the component will be a standalone component, not part of any component group. **CPACK_COMPONENT_${COMPNAME}_INSTALL_TYPES** Lists the installation types that this component is a part of. When one of these installations types is selected, this component will automatically be selected. Only available with NSIS. **CPACK_COMPONENT_GROUP_${GROUPNAME}_DISPLAY_NAME** The displayed name of the component group ${GROUPNAME}, used in graphical installers to display the component group name. This value can be any string. **CPACK_COMPONENT_GROUP_${GROUPNAME}_DESCRIPTION** An extended description of the component group ${GROUPNAME}, used in graphical installers to give the user additional information about the components contained within this group. Descriptions can span multiple lines using "\\n" as the line separator. **CPACK_COMPONENT_GROUP_${GROUPNAME}_BOLD_TITLE** A flag indicating whether the group title should be in bold. Only available with NSIS. **CPACK_COMPONENT_GROUP_${GROUPNAME}_EXPANDED** A flag indicating whether the group should start out "expanded", showing its components. Otherwise only the group name itself will be shown until the user clicks on the group. Only available with NSIS. **CPACK_INSTALL_TYPE_${INSTNAME}_DISPLAY_NAME** The displayed name of the installation type. This value can be any string. .. index:: single: cygwin CPack for Cygwin Setup ====================== Cygwin (http://www.cygwin.com/) is a Linux-like environment for Windows that consists of a run time DLL and a collection of tools. To add tools to the official cygwin, the cygwin setup program is used. The setup tool has very specific layouts for the source and binary trees that are to be included. CPack can create the source and binary tar files and correctly bzip them so that they can be uploaded to the cygwin mirror sites. You must of course have your package accepted by the cygwin community before that is done. Since the layout of the package is more restrictive than other packaging tools, you may have to change some of the install options for your project. The cygwin setup program requires that all files be installed into ``/usr/bin``, ``/usr/share/package-version``, ``/usr/share/man`` and ``/usr/share/doc/package-version``. The cygwin CPack generator will automatically add the ``/usr`` to the install directory for the project. The project must install things into ``share`` and ``bin``, and CPack will add the ``/usr`` prefix automatically. Cygwin also requires that you provide a shell script that can be used to create the package from the sources. Any cygwin specific patches that are required for the package must also be provided in a diff file. CMake's configure_file command can be used to create both of these files for a project. Since CMake is a cygwin package, the CMake code used to configure CMake for the cygwin CPack generators is as follows .. index:: single: command ; configure_file single: command ; include single: command ; install_files single: command ; set .. code-block:: cmake set (CPACK_PACKAGE_NAME CMake) # setup the name of the package for cygwin set (CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CMake_VERSION}") # the source has the same name as the binary set (CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_FILE_NAME}) # Create a cygwin version number in case there are changes # for cygwin that are not reflected upstream in CMake set (CPACK_CYGWIN_PATCH_NUMBER 1) # if we are on cygwin and have cpack, then force the # doc, data and man dirs to conform to cygwin style directories set (CMAKE_DOC_DIR "/share/doc/${CPACK_PACKAGE_FILE_NAME}") set (CMAKE_DATA_DIR "/share/${CPACK_PACKAGE_FILE_NAME}") set (CMAKE_MAN_DIR "/share/man") # These files are required by the cmCPackCygwinSourceGenerator and # the files put into the release tar files. set (CPACK_CYGWIN_BUILD_SCRIPT "${CMake_BINARY_DIR}/@CPACK_PACKAGE_FILE_NAME@- @CPACK_CYGWIN_PATCH_NUMBER@.sh") set (CPACK_CYGWIN_PATCH_FILE "${CMake_BINARY_DIR}/@CPACK_PACKAGE_FILE_NAME@- @CPACK_CYGWIN_PATCH_NUMBER@.patch") # include the sub directory for cygwin releases include (Utilities/Release/Cygwin/CMakeLists.txt) # when packaging source make sure to exclude the .build directory set (CPACK_SOURCE_IGNORE_FILES "/CVS/" "/\\\\.build/" "/\\\\.svn/" "\\\\.swp$" "\\\\.#" "/#" "~$") ``Utilities/Release/Cygwin/CMakeLists.txt``: .. code-block:: cmake # create the setup.hint file for cygwin configure_file ( "${CMake_SOURCE_DIR}/Utilities/Release/Cygwin/cygwin-setup.hint.in" "${CMake_BINARY_DIR}/setup.hint") configure_file ( "${CMake_SOURCE_DIR}/Utilities/Release/Cygwin/README.cygwin.in" "${CMake_BINARY_DIR}/Docs/@CPACK_PACKAGE_FILE_NAME@- @CPACK_CYGWIN_PATCH_NUMBER@.README") install_files (/share/doc/Cygwin FILES ${CMake_BINARY_DIR}/Docs/@CPACK_PACKAGE_FILE_NAME@- @CPACK_CYGWIN_PATCH_NUMBER@.README) # create the shell script that can build the project configure_file ( "${CMake_SOURCE_DIR}/Utilities/Release/Cygwin/cygwin-package.sh.in" ${CPACK_CYGWIN_BUILD_SCRIPT}) # Create the patch required for cygwin for the project configure_file ( "${CMake_SOURCE_DIR}/Utilities/Release/Cygwin/cygwin-patch.diff.in" ${CPACK_CYGWIN_PATCH_FILE}) The file ``Utilities/Release/Cygwin/cygwin-package.sh.in`` can be found in the CMake source tree. It is a shell script that can be used to re-create the cygwin package from source. For other projects, there is a template install script that can be found in ``Templates/cygwin-package.sh.in``. This script should be able to configure and package any cygwin based CPack project, and it is required for all official cygwin packages. Another important file for cygwin binaries is ``share/doc/Cygwin/package-version.README``. This file should contain the information required by cygwin about the project. In the case of CMake, the file is configured so that it can contain the correct version information. For example, part of that file for CMake looks like this:: Build instructions: unpack CMake-2.5.20071029-1-src.tar.bz2 if you use setup to install this src package, it will be unpacked under /usr/src automatically cd /usr/src ./CMake-2.5.20071029-1.sh all This will create: /usr/src/CMake-2.5.20071029.tar.bz2 /usr/src/CMake-2.5.20071029-1-src.tar.bz2 .. index:: single: Mac OS X ; Package Maker CPack for Mac OS X PackageMaker =============================== On the Apple Mac OS X operating system, CPack provides the ability to use the system PackageMaker tool. This section will show the CMake application install screens users will see when installing the CMake package on OS X. The CPack variables set to change the text in the installer will be given for each screen of the installer. .. _`figure-MacPackageinsidedmg`: .. figure:: image/MacPackageinsidedmg.png Mac Package inside .dmg In Figure :num:`figure-MacPackageinsidedmg`, the ``.pkg`` file found inside the ``.dmg`` disk image created by the CPack package maker for Mac OS X is seen. The name of this file is controlled by the ``CPACK_PACKAGE_FILE_NAME`` variable. If this is not set, CPack will use a default name based on the package name and version settings. .. _`figure-IntroductionScreenMacPackageMaker`: .. figure:: image/IntroductionScreenMacPackageMaker.png Introduction Screen Mac PackageMaker When the ``.pkg`` file is run, the package wizard starts with the screen seen in Figure :num:`figure-IntroductionScreenMacPackageMaker`. The text in this window is controlled by the file pointed to by the ``CPACK_RESOURCE_FILE_WELCOME`` variable. .. _`figure-ReadmesectionofMacpackagewizard`: .. figure:: image/ReadmesectionofMacpackagewizard.png Readme section of Mac package wizard The figure above shows the read me section of the package wizard. The text for this window is customized by using the ``CPACK_RESOURCE_FILE_README`` variable. It should contain a path to the file containing the text that should be displayed on this screen. .. _`figure-LicensescreenMacpackager`: .. figure:: image/LicensescreenMacpackager.png License screen Mac packager This figure contains the license text for the package. Users must accept the license for the installation process to continue. The text for the license comes from the file pointed to by the ``CPACK_RESOURCE_FILE_LICENSE`` variable. The other screens in the installation process are not customizable from CPack. To change more advanced features of this installer, there are two CPack templates that you can modify, ``Modules/CPack.Info.plist.in`` and ``Modules/CPack.Description.plist.in``. These files can be replaced by using the ``CMAKE_MODULE_PATH`` variable to point to a directory in your project containing a modified copy of either or both. .. index:: single: Mac OS X ; drag and drop installer CPack for Mac OS X Drag and Drop ================================ CPack also supports the creation of a Drag and Drop installer for the Mac. In this case a .dmg disk image is created. The image contains both a symbolic link to the /Applications directory and a copy of the project's install tree. In this case it is best to use a Mac application bundle or a single folder containing your relocatable installation as the only install target for the project. The variable ``CPACK_PACKAGE_EXECUTABLES`` is used to point to the application bundle for the project. .. _`figure-DragandDropLicensedialog`: .. figure:: image/DragandDropLicensedialog.png Drag and Drop License dialog .. _`figure-ResultingDragandDropfolders`: .. figure:: image/ResultingDragandDropfolders.png Resulting Drag and Drop folders CPack for Mac OS X X11 Applications =================================== CPack also includes an OS X X11 package maker generator. This can be used to package X11 based applications, as well as make them act more like native OS X applications by wrapping them with a script that will allow users to run them as they would any native OS X application. Much like the OS X PackageMaker generator, the OS X X11 generator creates a disk image ``.dmg`` file. In this example, an X11 application called KWPolygonalObjectViewerExample is packaged with the OS X X11 CPack generator. .. _`figure-MacOSXX11packagediskimage`: .. figure:: image/MacOSXX11packagediskimage.png Mac OS X X11 package disk image This figure shows the disk image created. In this case the ``CPACK_PACKAGE_NAME`` was set to KWPolygonalObjectViewerExample, and the version information was left with the CPack default of 0.1.1. The variable ``CPACK_PACKAGE_EXECUTABLES`` was set to the pair KWPolygonalObjectViewerExample and KWPolygonalObjectViewerExample, the installed X11 application is called KWPolygonalObjectViewerExample. .. _`figure-OpeningOSXX11diskimage`: .. figure:: image/OpeningOSXX11diskimage.png Opening OS X X11 disk image The above figure shows what a user would see after clicking on the ``.dmg`` file created by CPack. Mac OS X is mounting this disk image as a disk .. _`figure-Mounteddmgdiskimage`: .. figure:: image/Mounteddmgdiskimage.png Mounted .dmg disk image This figure shows the mounted disk image. It will contain a symbolic link to the /Applications directory for the system, and it will contain an application bundle for each executable found in ``CPACK_PACKAGE_EXECUTABLES``. The users can then drag and drop the applications into the Applications folder as seen in the figure below. .. _`figure-DraganddropapplicationtoApplications`: .. figure:: image/DraganddropapplicationtoApplications.png Drag and drop application to Applications CPack actually provides a C++ based executable that can run an X11 application via the Apple scripting language. The application bundle installed will run that forwarding application when the user double clicks on KWPolygonalObjectViewerExample. This script will make sure that the X11 server is started. The script that is run can be found in ``CMake/Modules/CPack.RuntimeScript.in``. The source for the script launcher C++ program can be found in ``Source/CPack/OSXScriptLauncher.cxx``. .. index:: single: Debian CPack for Debian Packages ========================= A Debian package ``.deb`` is simply an "ar" archive. CPack includes the code for the BSD style ar that is required by Debian packages. The Debian packager uses the standard set of CPack variables to initialize a set of Debian specific variables. These can be overridden in the ``CPACK_PROJECT_CONFIG_FILE``; the name of the generator is "DEB". The variables used by the DEB generator are as follows: **CPACK_DEBIAN_PACKAGE_NAME** defaults to lower case of ``CPACK_PACKAGE_NAME``. **CPACK_DEBIAN_PACKAGE_ARCHITECTURE** defaults to ``i386``. **CPACK_DEBIAN_PACKAGE_DEPENDS** This must be set to other packages that this package depends on, and if empty a warning is emitted. **CPACK_DEBIAN_PACKAGE_MAINTAINER** defaults to value of ``CPACK_PACKAGE_CONTACT`` **CPACK_DEBIAN_PACKAGE_DESCRIPTION** defaults to value of ``CPACK_PACKAGE_DESCRIPTION_SUMMARY`` **CPACK_DEBIAN_PACKAGE_SECTION** defaults to ``devl`` **CPACK_DEBIAN_PACKAGE_PRIORITY** defaults to ``optional`` .. index:: single: RPM CPack for RPM ============= CPack has support for creating Linux RPM files. The name of the generator as set in ``CPACK_GENERATOR`` is "RPM". The RPM package capability requires that rpmbuild is installed on the machine and is in PATH. The RPM packager uses the standard set of CPack variables to initialize RPM specific variables. The RPM specific variables are as follows: **CPACK_RPM_PACKAGE_SUMMARY** defaults to value of ``CPACK_PACKAGE_DESCRIPTION_SUMMARY`` **CPACK_RPM_PACKAGE_NAME** defaults to lower case of ``CPACK_PACKAGE_NAME`` **CPACK_RPM_PACKAGE_VERSION** defaults to value of ``CPACK_PACKAGE_VERSION``. **CPACK_RPM_PACKAGE_ARCHITECTURE** defaults to ``i386`` **CPACK_RPM_PACKAGE_RELEASE** defaults to ``1``. This is the version of the RPM file, not the version of the software being packaged. **CPACK_RPM_PACKAGE_GROUP** defaults to ``none``. **CPACK_RPM_PACKAGE_VENDOR** defaults to value of ``CPACK_PACKAGE_VENDOR`` CPack Files =========== There are a number of files that are used by CPack that can be useful for learning more about how CPack works and what options you can set. These files can also be used as the starting point for other generators for CPack. These files can mostly be found in the Modules and Templates directories of CMake and typically start with the prefix CPack. As of version 2.8.8, you may also refer to ``cpack --help-variable-list`` and ``cpack --help-variable`` for the full set of documented ``CPACK_*`` variables.